import os
from typing import Optional, List


def get_data_file_path() -> str:
    """获取数据文件目录路径"""
    current_dir = os.path.dirname(os.path.abspath(__file__))
    project_root = os.path.dirname(os.path.dirname(current_dir))
    return os.path.join(project_root, 'data')


def list_valid_files(data_dir: str) -> List[str]:
    """列出有效的数据文件"""
    all_files = os.listdir(data_dir)
    return [
        f for f in all_files
        if f.endswith('.xlsx') and not f.endswith(' - 贡献度.xlsx') and not f.startswith('~')
    ]


def display_files(files: List[str]) -> None:
    """显示文件列表"""
    for i, file_name in enumerate(files, 1):
        print(f"{i}. {file_name}")


def get_user_selection(files: List[str]) -> Optional[str]:
    """获取用户选择的文件"""
    while True:
        try:
            user_input = input("请输入要选择的文件编号 (输入 'q' 退出): ")
            if user_input.lower() == 'q':
                print("已取消选择")
                return None

            choice = int(user_input)
            if 1 <= choice <= len(files):
                selected_file = files[choice - 1]
                print(f"已选择文件: {selected_file}")
                return selected_file
            else:
                print(f"无效的编号，请输入 1 到 {len(files)} 之间的数字")
        except ValueError:
            print("请输入有效的数字或 'q' 退出")
        except KeyboardInterrupt:
            print("\n操作已取消")
            return None


def get_user_choice() -> Optional[str]:
    """获取用户对数据文件的选择"""
    data_dir = get_data_file_path()
    try:
        valid_files = list_valid_files(data_dir)

        if not valid_files:
            print("没有找到符合条件的文件")
            return None

        display_files(valid_files)
        return get_user_selection(valid_files)

    except FileNotFoundError:
        print(f"错误: 找不到数据目录 {data_dir}")
        return None
    except Exception as e:
        print(f"获取文件列表时出错: {e}")
        return None
